package com.ruoyi.apijson.config;

import java.util.Map;

import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;

import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.framework.web.service.PermissionService;

import apijson.RequestMethod;
import apijson.framework.APIJSONVerifier;
import apijson.orm.AbstractVerifier;
import apijson.orm.SQLConfig;

@SuppressWarnings("rawtypes")
public class FormVerifier extends APIJSONVerifier {

	@Override
	public boolean verifyAccess(SQLConfig config) throws Exception {
		// 启动加载
		if (visitor.getId() == null && config.getMethod() == RequestMethod.GET
				&& (config.getTable().equals("Script") || config.getTable().equals("Function")
						|| config.getTable().equals("Access") || config.getTable().equals("Request")
						|| config.getTable().equals("Document"))) {
			return true;
		}
		// "UNKNOWN": 未登录用户访问
		// "LOGIN": 登陆用户 访问
		// "OWNER": 创建人,比如我创建的订单、物流、评论等等
		// "ADMIN": 超级管理员 访问
		// "UNKNOWN","LOGIN","OWNER"交给框架处理
		
		// 判断是否启用 创建人字段UserId
		// 如果主键和创建人字段名一致，则不记录创建人
		String visitorIdKey = getVisitorIdKey(config);
		Object idKey = getIdKey(config.getDatabase(), config.getSchema(), config.getDatasource(), config.getTable());
		Object userId = visitorIdKey.equals(idKey) ? null : visitorIdKey;
		boolean createBy = true;
		if (userId == null) { // null 无效
			createBy = false;
		}
		// 从Access_map获取配置的权限标识
		boolean isOwner = false;
		// 判断是否为admin
		if (SysUser.isAdmin(Long.valueOf(visitor.getId().toString()))) {
			if (createBy && config.getMethod() == RequestMethod.POST) {
				isOwner = true;
			} else {
				return true;
			}
		} else {
			Map<RequestMethod, String[]> permsMap = AbstractVerifier.ACCESS_MAP.get(config.getTable());
			String[] perms = permsMap == null ? null : permsMap.get(config.getMethod());
			if (perms != null) {
				for (String perm : perms) {
					if (ROLE_MAP.containsKey(perm) == false) {
						// 判断当前用户是否有权限
						PermissionService permissionService = SpringUtils.getBean("ss", PermissionService.class);
						if (permissionService.hasPermi(perm) == false) {
							// 仅具有ROLE_ADMIN权限的用户可访问的逻辑
							throw new IllegalArgumentException("没有权限，请联系管理员授权");
						} else {
							// 拥有权限
							if (createBy && (config.getMethod() == RequestMethod.POST || config.getMethod() == RequestMethod.PUT)) {
								isOwner = true;
								break;
							}
							return true;
						}
					}
				}
			}
		}
		if (isOwner) {
			config.setRole(OWNER);
		}
		// 后面会校验其他已存在的角色
		return super.verifyAccess(config);
	}

	// 校验管理员
	@Override
	public void verifyAdmin() throws Exception {
		if (((FormUserVisitor) this.visitor).getRole().equals(ADMIN) == false) {
			throw new IllegalArgumentException("请勿伪造[" + ADMIN + "]角色");
		}
	}
}
